#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
const int MOD = 1e9 + 7;

// 快速幂函数，用于计算逆元
int qpow(int a, int x, int mod) {
  int res = 1LL;
  while (x) {
    if (x % 2)
      res = res * a % mod;
    a = a * a % mod;
    x /= 2;
  }
  return res;
}

// 预计算阶乘和阶乘逆元
int fac[N], invFac[N];
void init() {
  fac[0] = 1;
  for (int i = 1; i < N; ++i) {
    fac[i] = (fac[i - 1] * i) % MOD;
  }
  invFac[N - 1] = qpow(fac[N - 1], MOD - 2, MOD);

  for (int i = N - 2; i >= 0; --i) {
    invFac[i] = (invFac[i + 1] * (i + 1)) % MOD;
  }
}

int main() {
  init();
  int n, d;
  cin >> n >> d;
  vector<int> a(n);
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }

  // 关键步骤1：排序数组，确保插入顺序正确
  sort(a.begin(), a.end());
  int ans = 1;

  // 关键步骤2：计算每个数的插入位置选择数
  for (int i = 0; i < n; i++) {
    // 计算当前数X可以插入的范围下界：X-D
    int nd = a[i] - d;

    // 使用二分查找找到第一个 >= X-D 的位置
    int pos = lower_bound(a.begin(), a.end(), nd) - a.begin();

    // 计算在X之前有多少个位于[X-D, X-1]之间的数
    // 注意：这里计算的是K+1（空隙数量），因为包括末尾位置
    int pk = i - pos + 1;

    // 如果pk <= 0，说明X没有合法的插入位置
    if (pk <= 0) {
      ans = 0;
      break;
    }

    // 乘法原理：每个X有pk个插入位置选择
    // 这里实际上计算的是 ∏(K+1) 而不是 C(m+K, m)
    // 因为代码采用了不同的计算方法
    ans = (ans * (pk % MOD)) % MOD;
  }

  // 关键步骤3：处理重复数字的排列问题
  int id = 0;
  while (id < n) {
    int j = id + 1;
    // 统计连续相同数字的个数
    while (j < n && a[j] == a[id]) {
      j++;
    }
    int cnt = j - id;

    // 除以cnt!，因为相同的数字交换顺序不产生新排列
    // 这相当于将之前的 ∏(K+1) 修正为正确的组合数
    ans = (ans * invFac[cnt]) % MOD;
    id = j;
  }

  cout << ans % MOD << endl;
  return 0;
}